package br.edu.com1263.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;

import br.edu.com1263.model.Aluno;
import br.edu.com1263.model.Tarefa;
import br.edu.com1263.model.TrabalhoPostado;
import br.edu.com1263.model.Turma;
import br.edu.com1263.negocio.AlunoFacade;
import br.edu.com1263.negocio.ProfessorFacade;
import br.edu.com1263.negocio.TarefaFacade;
import br.edu.com1263.negocio.TrabalhoPostadoFacade;
import br.edu.com1263.negocio.TurmaFacade;

public class TrabalhoPostadoAction extends MainAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 531360445556353490L;
	private TrabalhoPostadoFacade trabalhoPostadoFacade;
	private ProfessorFacade professorFacade;
	private AlunoFacade alunoFacade;
	private TarefaFacade tarefaFacade;
	private TurmaFacade turmaFacade;

	private String editar;
	private String remover;
	private String adicionar;
	private String consultar;
	private String menu;
	private String nomeAluno;

	private Date dataHora;


	private Long idAluno;
	private Long idTarefa;
	private Long idProfessor;
	private Collection<Tarefa> tarefas = null;
	private Collection<TrabalhoPostado> postados = null;
	private Long idPostado;

	private File upload;
	private String uploadContentType;
	private String uploadFileName; 


	public TrabalhoPostadoAction(TrabalhoPostadoFacade trabalhoPostadoFacade,
			AlunoFacade alunoFacade, TarefaFacade tarefaFacade, 
			ProfessorFacade professorFacade, TurmaFacade turmaFacade) {
		super();
		this.trabalhoPostadoFacade = trabalhoPostadoFacade;
		this.alunoFacade = alunoFacade;
		this.tarefaFacade = tarefaFacade;
		this.professorFacade = professorFacade;
	}

	//	____________________________________________________
	//  Acoes
	//____________________________________________________


	@Override
	public String execute() throws Exception {
		clearErrorsAndMessages();
		dataHora = new Date();
		Aluno aluno = recuperarAlunoAtualizado();
		idAluno = aluno.getId();

		if(adicionar != null){
			adicionar = null;
			TrabalhoPostado tPostado = new TrabalhoPostado(dataHora);

			Tarefa tarefa = tarefaFacade.consultar(idTarefa);
			tPostado.setAluno(aluno);
			tPostado.setTarefa(tarefa);

			tPostado.setNomeArquivo(uploadFileName);
			tPostado.setArquivo(getBytesFromFile(upload));

			trabalhoPostadoFacade.salvar(tPostado);
			
			postados = trabalhoPostadoFacade.consultarTrabalhosAluno(idAluno);
			addActionMessage("O Trabalho foi adicionado corretamente.");
			return "view";
		}

		if(consultar != null){
			consultar = null;
			if (idPostado == null)
			{
				addActionMessage("Um trabalho deve ser selecionado.");
				return "view";
			}
			TrabalhoPostado t = trabalhoPostadoFacade.consultar(idPostado);
			if (t != null)
			{
				idPostado = t.getId();
				dataHora = (Date) t.getDataHora();
				idTarefa = t.getTarefa().getId();
			}
			return "view";
		}
		if(editar != null){
			editar = null;
			TrabalhoPostado t = trabalhoPostadoFacade.consultar(idPostado);
			t.setDataHora(dataHora);
			t.setId(idPostado);

			if (upload != null )
			{
				t.setNomeArquivo(uploadFileName);
				t.setArquivo(getBytesFromFile(upload));
			}
			trabalhoPostadoFacade.alterar(t);
			
			postados = trabalhoPostadoFacade.consultarTrabalhosAluno(idAluno);
			addActionMessage("O Trabalho foi editado corretamente.");
			return "view";
		}

		if(remover != null){
			remover = null;
			TrabalhoPostado t = trabalhoPostadoFacade.consultar(idPostado);
			if (t != null)
			{
				trabalhoPostadoFacade.remover(t);
			}
			postados = trabalhoPostadoFacade.consultarTrabalhosAluno(idAluno);
			addActionMessage("O Trabalho foi removido corretamente.");
			return "view";
		}
		
		if(menu != null){
			menu = null;
			return "menu";
		}
		return "menu";
	}


	public String cadastraTrabalhoPostado() throws Exception {
		Aluno aluno = recuperarAlunoAtualizado();
		nomeAluno = aluno.getNome();
		idAluno = aluno.getId();

		//REQUISITO FUNCIONAL - Mostra somente os trabalhos de uma aluno
		postados = trabalhoPostadoFacade.consultarTrabalhosAluno(idAluno);
		
		Collection<Turma> turmas = aluno.getTurmas();
		HashSet<Tarefa> tarefasSet = new HashSet<Tarefa>();
		if (turmas != null)
		{
			for (Turma turma : turmas)
				tarefasSet.addAll(turma.getTarefas());
		}

		tarefas = tarefasSet;

		return "view";

	}


	//----------------------------------------------------
	//			Gets e sets
	//----------------------------------------------------


	public TrabalhoPostadoFacade getTrabalhoPostadoFacade() {
		return trabalhoPostadoFacade;
	}

	public void setTrabalhoPostadoFacade(TrabalhoPostadoFacade trabalhoPostadoFacade) {
		this.trabalhoPostadoFacade = trabalhoPostadoFacade;
	}

	public AlunoFacade getAlunoFacade() {
		return alunoFacade;
	}

	public void setAlunoFacade(AlunoFacade alunoFacade) {
		this.alunoFacade = alunoFacade;
	}

	public TarefaFacade getTarefaFacade() {
		return tarefaFacade;
	}

	public void setTarefaFacade(TarefaFacade tarefaFacade) {
		this.tarefaFacade = tarefaFacade;
	}

	public String getEditar() {
		return editar;
	}

	public void setEditar(String editar) {
		this.editar = editar;
	}

	public String getRemover() {
		return remover;
	}

	public void setRemover(String remover) {
		this.remover = remover;
	}

	public String getAdicionar() {
		return adicionar;
	}

	public void setAdicionar(String adicionar) {
		this.adicionar = adicionar;
	}

	public String getConsultar() {
		return consultar;
	}

	public void setConsultar(String consultar) {
		this.consultar = consultar;
	}

	public String getMenu() {
		return menu;
	}

	public void setMenu(String menu) {
		this.menu = menu;
	}


	public Date getDataHora() {
		return dataHora;
	}

	public void setDataHora(Date dataHora) {
		this.dataHora = dataHora;
	}

	public Long getIdAluno() {
		return idAluno;
	}

	public void setIdAluno(Long idAluno) {
		this.idAluno = idAluno;
	}


	public Long getIdTarefa() {
		return idTarefa;
	}

	public void setIdTarefa(Long idTarefa) {
		this.idTarefa = idTarefa;
	}

	public Collection<Tarefa> getTarefas() {
		return tarefas;
	}

	public void setTarefas(Collection<Tarefa> tarefas) {
		this.tarefas = tarefas;
	}

	public Collection<TrabalhoPostado> getPostados() {
		return postados;
	}

	public void setPostados(Collection<TrabalhoPostado> postados) {
		this.postados = postados;
	}

	public Long getIdPostado() {
		return idPostado;
	}

	public void setIdPostado(Long idPostado) {
		this.idPostado = idPostado;
	}

	public Collection<TrabalhoPostado> gePostados() {
		return postados;
	}

	public void settPostados(Collection<TrabalhoPostado> postados) {
		this.postados = postados;
	}

	public String getNomeAluno() {
		return nomeAluno;
	}

	public void setNomeAluno(String nomeAluno) {
		this.nomeAluno = nomeAluno;
	}

	// Returns the contents of the file in a byte array.
	public static byte[] getBytesFromFile(File file) throws IOException {
		InputStream is = new FileInputStream(file);

		// Get the size of the file
		long length = file.length();

		// You cannot create an array using a long type.
		// It needs to be an int type.
		// Before converting to an int type, check
		// to ensure that file is not larger than Integer.MAX_VALUE.
		if (length > Integer.MAX_VALUE) {
			// File is too large
		}

		// Create the byte array to hold the data
		byte[] bytes = new byte[(int)length];

		// Read in the bytes
		int offset = 0;
		int numRead = 0;
		while (offset < bytes.length
				&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
			offset += numRead;
		}

		// Ensure all the bytes have been read in
		if (offset < bytes.length) {
			throw new IOException("Could not completely read file "+file.getName());
		}

		// Close the input stream and return bytes
		is.close();
		return bytes;
	}

	public ProfessorFacade getProfessorFacade() {
		return professorFacade;
	}

	public void setProfessorFacade(ProfessorFacade professorFacade) {
		this.professorFacade = professorFacade;
	}

	public TurmaFacade getTurmaFacade() {
		return turmaFacade;
	}

	public void setTurmaFacade(TurmaFacade turmaFacade) {
		this.turmaFacade = turmaFacade;
	}

	public Long getIdProfessor() {
		return idProfessor;
	}

	public void setIdProfessor(Long idProfessor) {
		this.idProfessor = idProfessor;
	}

	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	
}
